iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Mobile Development

初窺Flutter系列 第 28

高階主題-用戶輸入

  • 分享至 

  • xImage
  •  

用戶輸入是app中常見的功能,像是輸入帳號密碼、用戶名等。
以下是常見的用戶輸入方式
1.文本輸入框(Text Input)
使用TextFieldTextFormField Widget來創建文本輸入框。

TextField(
  decoration: InputDecoration(
    labelText: '請輸入文字',
  ),
  onChanged: (text) {
    // 當文本發生變化時,執行相應操作
  },
)

https://ithelp.ithome.com.tw/upload/images/20231013/20162684gELY9zO9wT.png
2.複選框(Checkbox)
使用Checkbox Widget 使用戶選擇或取消選項。

// 創建一個bool變數isChecked,初始化為false,表示複選框的選擇狀態。
bool isChecked = false; 

Checkbox(
  value: isChecked, // 設置複選框當前的選擇狀態,根據isChecked變數的值設置。
  onChanged: (value) {
    // 當用戶點擊複選框來勾選或取消勾選時執行的代碼。
    setState(() {
      isChecked = value; // 更新isChecked變數以反映新的選中狀態。
    });
  },
)
![https://ithelp.ithome.com.tw/upload/images/20231013/201626841bwQhha0Ig.png](https://ithelp.ithome.com.tw/upload/images/20231013/201626841bwQhha0Ig.png)

3.選擇框 (Dropdown):
使用DropdownButton Widget 來創建下拉選擇框,讓用戶從定義的選項中進行選擇。

// 創建一個字符串變數selectedOption,並初始化為'選項1',表示當前選擇的選項。
String selectedOption = '選項1'; 

DropdownButton<String>(
  value: selectedOption, // 設置下拉選擇框的當前選擇值,根據selectedOption變數的值設置。
  onChanged: (String newValue) {
    // 當用戶選擇不同選項時執行的代碼。
    setState(() {
      selectedOption = newValue; // 更新selectedOption變數以反映新的選擇值。
    });
  },
  //依各自需求定義選項數
  items: ['選項1', '選項2', '選項3'].map((String option) {
    // 創建下拉選擇框的選項列表。
    return DropdownMenuItem<String>(
      value: option, // 每個選項的值,這將成為新的selectedOption的值。
      child: Text(option), // 選項的顯示文本,將顯示在下拉選擇框中。
    );
  }).toList(),
)

https://ithelp.ithome.com.tw/upload/images/20231013/20162684Qnttm79ujU.png
https://ithelp.ithome.com.tw/upload/images/20231013/20162684MUkwdjRLPu.png

以下是把所有方式結合後的程式碼做了一個仿用戶基本資料填寫
包含輸入用戶名(Text Input)、性別勾選(Checkbox)、語言選擇(Dropdown),語言只選擇,不會真的切換,另外也做了個按鈕,不過尚無判斷功能,下一章學習表單驗證之後會再試著加上

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: LoginScreen(),
    );
  }
}

class LoginScreen extends StatefulWidget {
  @override
  _LoginScreenState createState() => _LoginScreenState();
}

class _LoginScreenState extends State<LoginScreen> {
  String textInput = ''; // 用戶輸入的名字

  bool isMale = false; // 男性複選框的選中狀態
  bool isFemale = false; // 女性複選框的選中狀態

  String selectedLanguage = '英文'; // 選擇的語言
  List<String> languageOptions = ['英文', '法文', '西班牙文', '德文', '中文'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('用戶輸入整合'),
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              TextField(
                decoration: InputDecoration(
                  labelText: '請輸入名字',
                ),
                onChanged: (text) {
                  setState(() {
                    textInput = text;
                  });
                },
              ),
              Row(
                children: <Widget>[
                  Checkbox(
                    value: isMale,
                    onChanged: (value) {
                      setState(() {
                        isMale = value!;
                        if (isMale) {
                          // 如果選擇男性,取消女性選擇
                          isFemale = false;
                        }
                      });
                    },
                  ),
                  Text('男性'),
                ],
              ),
              Row(
                children: <Widget>[
                  Checkbox(
                    value: isFemale,
                    onChanged: (value) {
                      setState(() {
                        isFemale = value!;
                        if (isFemale) {
                          // 如果選擇女性,取消男性選擇
                          isMale = false;
                        }
                      });
                    },
                  ),
                  Text('女性'),
                ],
              ),
              DropdownButton<String>(
                value: selectedLanguage,
                onChanged: (String? newValue) {
                  setState(() {
                    selectedLanguage = newValue!;
                  });
                },
                items: languageOptions.map((String option) {
                  return DropdownMenuItem<String>(
                    value: option,
                    child: Text(option),
                  );
                }).toList(),
              ),
              SizedBox(height: 20),
              Text('目前的語言: $selectedLanguage'),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  // 在按鈕點擊時執行的代碼
                  showDialog(
                    context: context,
                    builder: (BuildContext context) {
                      return AlertDialog(
                        title: Text('已提交'),
                      );
                    },
                  );
                },
                child: Text('提交'),
              ),
              SizedBox(height: 20),
            ],
          ),
        ),
      ),
    );
  }
}

介面呈現方式
https://ithelp.ithome.com.tw/upload/images/20231013/20162684SU6kbVDqSk.png

影片呈現
https://imgur.com/a/tl1Yo0g


上一篇
Flutter動畫-交錯動畫
下一篇
高階主題-表單驗證
系列文
初窺Flutter30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言